#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/ioctl.h>
#include "../include/ralink_gpio.h"
#include "../include/gpio.h"


int gpio_set_dir(int r, int dir)
{
	int fd, req;

	fd = open(GPIO_DEV, O_RDONLY);
	if (fd < 0) {
		perror(GPIO_DEV);
		return -1;
	}

	if (r == gpio9564) {
		req = RALINK_GPIO9564_SET_DIR;
	} else if (r == gpio6332) {
		req = RALINK_GPIO6332_SET_DIR;
	} else {
		req = RALINK_GPIO_SET_DIR;
	}
	
	if (ioctl(fd, req, dir) < 0) {
		perror("ioctl");
		close(fd);
		return -1;
	}
	
	close(fd);
	
	return 0;
}

int gpio_write(int r, int value)
{
	int fd, req;

	fd = open(GPIO_DEV, O_RDONLY);
	if (fd < 0) {
		perror(GPIO_DEV);
		return -1;
	}
	
	if (r == gpio9564)
		req = RALINK_GPIO9564_WRITE;
	else if (r == gpio6332)
		req = RALINK_GPIO6332_WRITE;
	else
		req = RALINK_GPIO_WRITE;
	
	if (ioctl(fd, req, value) < 0) {
		perror("RALINK_GPIO_WRITE fail.\n");
		close(fd);
		exit(1);
		return -1;
	}
	
	close(fd);
	
	return 0;
}
int gpio_read(int r)
{
	int fd, req;
	int data;

	fd = open(GPIO_DEV, O_RDONLY);
	if (fd < 0) {
		perror(GPIO_DEV);
		exit(1);	//over
	}

	if (r == gpio9564) {
		req = RALINK_GPIO9564_READ;
	} else if (r == gpio6332) {
		req = RALINK_GPIO6332_READ;
	} else {
		req = RALINK_GPIO_READ;
	}
	
	if (ioctl(fd, req, (void *)&data) < 0) {
		
		perror("RALINK_GPIO_READ fail.\n");
		close(fd);
		exit(1);	//over
	}

	
	close(fd);
	
	return data;
}

int write_gpio_num(int gpio,int num) {
    int gpio_reg;
	int offset;
	int data;
    if(gpio >=0 && gpio <= 31) {
        gpio_reg = gpio3100;
        offset = 1<<gpio;
    } else if (gpio >= 32 && gpio <= 63) {
        gpio_reg = gpio6332;
        offset = 1<<(gpio-32);
    } else {
        gpio_reg= gpio9564;
        offset = 1<<(gpio-64);
    }
    data = gpio_read(gpio_reg);
    
    if (num == 1) {
        data |= (1<<gpio);
    } else {
        data &= ~(1<<gpio);
    }
    gpio_write(gpio_reg, data);
    return 0;
}



